OpenCV学习记录(二 图像去噪、四种滤波方式) 您所在的位置:网站首页 opencv 滤波算法 OpenCV学习记录(二 图像去噪、四种滤波方式)

OpenCV学习记录(二 图像去噪、四种滤波方式)

2024-04-07 08:27| 来源: 网络整理| 查看: 265

图像去噪:使用OpenCV对图像进行处理,考虑对图像进行去除噪声点,通过不同方法。

OpenCV对于图像去噪(又称图像平滑)提供了四种方法,分别是均值滤波、方框滤波、中值滤波和高斯滤波。

图片去噪处理一般是在图像灰度化之后,图像灰度化之后,会存在噪声点,这些噪声点不是我们所需要的,因此需要图像去噪技术。

要想去除图片的噪声,需要一张有噪声的图片,下面代码为图片添加噪声:

import cv2 import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] img = cv2.imread("yiyuan.jpg") h, w = img.shape[0:2] #去噪声 for i in range(3000): #添加3000个噪声点 x=np.random.randint(0, h) #生成随机数,随机行 y=np.random.randint(0, w) #生成随机数,随机列 img[x,y,:]=255 #255为白色,生成白色噪声点 img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) plt.imshow(img) plt.axis('off') plt.savefig("yi.jpg") plt.show()

效果图如下:

一、均值滤波

定义:均值滤波是指任意一点的像素值,都是周围NM个像素值的均值。

均值滤波函数:

import cv2 import numpy as np def junzhi(img,size): #img输入,size均值滤波器的尺寸,>=3,且必须为奇数 num = int((size - 1) / 2) # 输入图像需要填充的尺寸 img = cv2.copyMakeBorder(img, num, num, num, num, cv2.BORDER_REPLICATE) #对传入的图像进行扩充,尺寸为num h1, w1 = img.shape[0:2] # 高斯滤波 img1 = np.zeros((h1, w1, 3), dtype="uint8") #定义空白图像,用于输出中值滤波后的结果 for i in range(num, h1-num): #对扩充图像中的原图进行遍历 for j in range(num, w1-num): sum=0 sum1=0 sum2=0 for k in range(i-num,i+num+1): #求中心像素周围size*size区域内的像素的平均值 for l in range(j-num,j+num+1): sum=sum+img[k,l][0] sum1=sum1+img[k,l][1] sum2=sum2+img[k,l][2] sum=sum/(size**2) #除以核尺寸的平方 sum1 = sum1/(size**2) sum2 = sum2/(size**2) img1[i, j]=[sum,sum1,sum2] #复制给空白图像 img1=img1[(0+num):(h1-num),(0+num):(h1-num)] #从滤波图像中裁剪出原图像 return img1 img=cv2.imread("yiyuan.jpg") h, w = img.shape[0:2] #加噪声 for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, w) img[x,y,:] = 255 #调用均值滤波函数 result=junzhi(img,5) #传入读取的图像和核尺寸 cv2.imshow("zaosheng",img) cv2.imshow("junzhi",result) cv2.waitKey(0)

效果如图:

OpenCV中均值滤波函数库函数的使用:

函数:cv2.blur(img,(size,size1))

img:需要处理的图像

(size,size1):表示核大小,是以(宽度,高度)表示的元祖形式。

使用库函数进行均值滤波图像处理,效果如下:

代码如下:

import cv2 import numpy as np img=cv2.imread("yiyuan.jpg") h, w = img.shape[0:2] for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, w) img[x,y,:] = 255 #调用均值滤波函数 result=cv2.blur(img,(5,5)) #传入读取的图像和核尺寸 cv2.imshow("Noise",img) cv2.imshow("junzhi",result) cv2.waitKey(0)

二、方框滤波

原理:方框滤波与均值滤波原理相同,是指任意一点的像素值,都是周围NM个像素值的均值。但是方框滤波需要均一化处理,如果不做均一化处理,容易产生溢出,溢出的像素值为255,即为白色。均一化处理的参数为布尔型变量normalize,当normalize=Ture时,表示需要均一化处理,normalize=Flase时,不需要均一化处理。

数学原理:

函数原型:result=cv2.boxFilter(img,deep,(size,size1),normalize)

#img:原始图像,需要进行处理的图片

#deep:原始图像深度

#(size,size1):核尺寸

#normalize:归一化参数,normalize=1进行归一化处理,normalize=0不进行归一化处理。

使用方框滤波库函数处理图像

代码如下:

import cv2 import numpy as np img=cv2.imread("jiesi.jpg") h, w = img.shape[0:2] #加噪声 for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, w) img[x,y,:] = 255 #调用均值滤波函数 result=cv2.boxFilter(img, -1, (5,5), normalize=1) result1=cv2.boxFilter(img, -1, (5,5), normalize=0) cv2.imshow("jia zao yuan hua",img) cv2.imshow("jun yi-opencv",result) cv2.imshow("bu jun yi-opencv",result1) cv2.waitKey(0)

效果图如下:

三、中值滤波

原理:选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

换成图像模板来理解就是将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。

函数原型:result=cv2.medianBlur(img,size)

#img:需要进行中值滤波处理的图像

#size:核大小,必须是大于1的奇数。

中值滤波库函数的使用

代码如下:

import cv2 import numpy as np img=cv2.imread("yiyuan.jpg") h, w = img.shape[0:2] for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, w) img[x,y,:] = 255 #调用OpenCV库函数中的均值滤波函数 result=cv2.medianBlur(img, 5) #核尺寸是大于1的奇数 cv2.imshow("yuan tu",img) cv2.imshow("zhong zhi-opencv",result) cv2.waitKey(0)

效果图如下:

四、高斯滤波

原理:高斯平滑也是邻域平均的思想对图像进行平滑的一种方式,在图像高斯平滑中,不同位置的像素被赋予了不同的权重。

高斯函数:

OpenCV中高斯滤波库函数的使用:

函数原型:result=cv2.GaussianBlur(img,(size,size1),sigmaX,sigmaY)

        #img:需要处理的图像

        #(size,size1):高斯核尺寸

        #sigmaX:X方向上的高斯核标准偏差

        #sigmaY:Y方向上的高斯核标准偏差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigma都为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,建议指定所有ksize,sigmaX和sigmaY。核大小(size,size)必须是奇数,X方向方差主要控制权重。

OpenCV高斯滤波库函数的使用:

代码如下:

import cv2 import numpy as np img=cv2.imread("jiesi.jpg") h, w = img.shape[0:2] for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, w) img[x,y,:] = 255 #调用OpenCV库函数中的高斯滤波函数 result=cv2.GaussianBlur(img,(5,5),1,1) #传入读取的图像和核尺寸 (5,5)必须是奇数 cv2.imshow("yuantu",img) cv2.imshow("gaosi-opencv",result) cv2.waitKey(0)

图像效果如下:

 高斯滤波实质上是一种信号的滤波器,大多数图像使用高斯滤波器会得到信噪比SNR较高的图像(反应真实信号)。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有